if(not defined _CEF_ROOT_EXPLICIT)
	message(FATAL_ERROR "use find_package(CEF) to load this file")
endif()

##共享的配置

#检测操作系统平台
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
	set(OS_MACOSX 1)
	set(OS_POSIX 1)
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
	set(OS_LINUX 1)
	set(OS_POSIX 1)
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
	set(OS_WINDOWS 1)
endif()

#检测项目的架构
if(not defined PROJECT_ARCH)
	#根据void *指针的大小来判断是64位还是32位
	if(CMAKE_SIZEOF_VOID_P MATCHES 8)
		set(PROJECT_ARCH "x86_64")
	else()
		set(PROJECT_ARCH "x86")
	endif()
	
	if(OS_MACOSX)
		message(WARNING "no project value specified, using ${PROJECT_ARCH}")
	endif()
endif()

if("${CMAKE_GENERATOR}" STREQUAL "Ninja")
	set(GEN_NIJIA 1)
elseif("${CMAKE_GENERATOR}" STREQUAL "Unix Makefiles")
	set(GEN_MAKEFILES 1)
endif()

#检测构建类型
#如果使用的nijia或者makefile构建，但是有没有指定CMAKE_BUILD_TYPE，
#那么就默认指定为Release
if(not CMAKE_BUILD_TYPE and（GEN_NIJIA or GEN_MAKEFILES）)
	set(CMAKE_BUILD_TYPE Release)
	message(WARNING "no CMAKE_BUILD_TYPE value selected, using ${CMAKE_BUILD_TYPE}")
endif()

#设置libcef的头文件目录
set(CEF_INCLUDE_PATH "${_CEF_ROOT}")

#path to libcef_dll_wrapper target
set(CEF_LIBCEF_DLL_WRAPPER_PATH "${_CEF_ROOT/libcef_dll}")

#shared compiler/linker flags
list(
	APPEND
	CEF_COMPILER_DEFINES
	#允许c++程序使用stdint.h 里面的宏，这些宏c++标准里是没有的
	__STDC_CONSTANT_MACROS __STDC_FORMAT_MACROS
	)

if(OS_LINUX)
	#平台相关的编译器选项，连接器选项
	#共享库
	set(CEF_LIBTYPE SHARED)
	#编译器选项
	list(APPEND CEF_COMPILER_FLAGS
		-fno-strict-aliasing                          # 避免不同类型对象引用同一块内存，然后优化级别大于o1时引起的问题
		-fPIC                                         # 生成位置无关的代码，如果要生成动态库，就得这样
		-fstack-protector                             # 启用堆栈保护，避免堆栈溢出可以引发的潜在bug
		-funwind-tables                               # 支持堆栈跟踪
		-fvisibility=hidden                           # 隐藏没有明确标记为可导出的符号
		--param=ssp-buffer-size=4                     # 堆栈保护相关特性
		-pipe                                         # 使用管道进行构建阶段的通信，代替生成临时文件
		-pthread                                      # 使用线程库
		-Wall                                         # 启用编译警告
		-Werror                                       # 将警告视为错误
		-Wno-missing-filed-initializers               # 忽略未初始化字段警告
		-Wno-unused-parameter                         # 忽略未引用变量警告
		)
	                                                  # 编译器c相关的标志，c99标准
	list(APPEND CEF_C_COMPILER_FLAGS
		-std=c99
		)
	list(APPEND CEF_CXX_COMPILER_FLAGS
		-fno-exceptions                               # 禁用异常
		-fno-rtti                                     # 禁用运行时类型信息
		-fno-threadsafe-statics                       # 不产生线程安全检查的代码
		-fobjc-call-cxx-cdtors                        # 允许oc对象里面调用c++构造和析构函数
		-fvisibility-inlines-hidden                   # 默认隐藏所有内联函数,可以减少导出符号表的大小，生成文件的体积
		-std=gnu++11                                  # c++11
		-Wsign-compare                                # 对signed/unsigned 混合，发出类型警告
		)
